#ifndef _COMMON_H_
#define _COMMON_H_

#include <ctype.h>
#include <iostream>
#include <list>
#include <map>
#include <math.h>
#include <semaphore.h>
#include <set>
#include <string>
#include <thread>
#include <vector>
#include "sys_log.h"
#include "cJSON.h"

using namespace std;

#define PARAM_CHECK_IS_VALID(param, log, ret)                                                   \
    if (param) {                                                                                \
        std::cout << "error: " << __FUNCTION__ << "[" << __LINE__ << "]: " << log << std::endl; \
        return ret;                                                                             \
    }

#define PARAM_CHECK_IS_VALID_AND_EXEC_CMD(param, log, cmd, ret)                                 \
    if (param) {                                                                                \
        std::cout << "error: " << __FUNCTION__ << "[" << __LINE__ << "]: " << log << std::endl; \
        cmd;                                                                                    \
        return ret;                                                                             \
    }

#define MQTT_QOS                     1                                 /* 服务等级 */
#define sys_log_info(fmt, ...)       printf("info: %s[%d]:" fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#define sys_log_debug(fmt, ...)      printf("info: %s[%d]:" fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#define sys_log_error(fmt, ...)      printf("info: %s[%u]:" fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__)
// /* 消息类型 */
// enum {
//     MSG_ID_STAR = 0x70,
//     MSG_ID_MQ_DEV,
//     MSG_ID_MQ_DEV_READ,
//     MSG_ID_MQ_DEV_WRITE,
//     MSG_ID_MQ_DEV_SET,
//     MSG_ID_MQ_APP_READ,
//     MSG_ID_MQ_APP_WRITE,
// };

// // 485硬件接口
// typedef struct {
//     int address;    // 485设备节点地址
//     int baudrate;   // 波特率
//     char port[50];  // 端口设备文件  "/dev/chintRS485_4" "/dev/chintRS485_5"
//     int stop_bit;   // 停止位 只支持整数位
//     int data_bit;   // 数据位
//     char parity;    // 奇偶校验
// } hardware_t;

// // 点表
// typedef struct
// {
//     char name[20];     // 数据点名字
//     double unit;       // 单位转换系数，默认为标准单位 电压：V    电流：A    频率：Hz
//     char permi[5];     // 权限
//     uint16_t address;  // 地址
//     uint8_t len;       // 数据长度 单位为字节
//     int height;
//     std::string type; /* 数据类型 */
//     int64_t time;     // 时间戳
//     int32_t rValue;   // 缓存值
//     uint16_t wValue;  // 缓存值
//     int32_t tol;      // 超时容限
//     bool rFlag;
//     bool wFlag;
// } point_item_t;

// // 单个设备信息
// typedef struct {
//     int id;
//     bool state;  // 是否离线状态
//     char name[20];
//     char uuid[20];  // SN
//     char type[20];
//     char deviceSn[21];   // SN
//     char productKey[5];  // model
//     std::string model;   // model
//     char softwareVersion[2];
//     char hardwareVersion[2];
//     char profile[100];  // 设备点表文件
//     int point_cnt;
//     hardware_t hardware;             // 端口配置
//     vector<point_item_t> point_item; /* 点表数组 */
//     uint8_t switch_state;            // 0 :分 1: 合
// } devices_def_t;

typedef struct {
    std::string topic;
    std::string payload;
} msg_t;

#endif